Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


tests/link.py HEAD (4fc8e03d) Text, 37.87 KB

T8b949e# import tracemalloc
T8b949e# tracemalloc.start()

Tff7b72import T7ee787unittest

Tff7b72import T7ee787subprocess
Tff7b72import T7ee787shlex
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72import T7ee787random
Tff7b72from T7ee787unittest Tff7b72import Te6edf3skipIf
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72from T7ee787testsT7ee787.T7ee787channel Tff7b72import Te6edf3MessageTest
Tff7b72from T7ee787RNST7ee787.T7ee787Channel Tff7b72import Te6edf3MessageBase
Tff7b72from T7ee787RNST7ee787.T7ee787Buffer Tff7b72import Te6edf3StreamDataMessage
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787LocalInterface Tff7b72import Te6edf3LocalClientInterface
Tff7b72from T7ee787math Tff7b72import Te6edf3ceil

Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrns_unit_testsTa5d6ff"

Te6edf3fixed_keys Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6fff8953ffaf607627e615603ff1530c82c434cf87c07179dd7689ea776f30b964cfb7ba6164af00c5111a45e69e57d885e1285f8dbfe3a21e95ae17cf676b0f8b7Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff650b5d76b6bec0390d1f8cfca5bd33f9Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffd85d036245436a3c33d3228affae06721f8203bc364ee0ee7556368ac62add650ebf8f926abf628da9d92baaa12db89bd6516ee92ec29765f3afafcb8622d697Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1469e89450c361b253aefb0c606b6111Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ff8893e2bfd30fc08455997caf7abb7a6341716768dbbf9a91cc1455bd7eeaf74cdc10ec72a4d4179696040bac620ee97ebc861e2443e5270537ae766d91b58181Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffe5fe93ee4acba095b3b9b6541515ed3eTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffb82c7a4f047561d974de7e38538281d7f005d3663615f30d9663bad35a716063c931672cd452175d55bcdd70bb7aa35a9706872a97963dc52029938ea7341b39Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1333b911fa8ebb16726996adbe3c6262Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ff08bb35f92b06a0832991165a0d9b4fd91af7b7765ce4572aa6222070b11b767092b61b0fd18b3a59cae6deb9db6d4bfb1c7fcfe076cfd66eea7ddd5f877543b9Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffd13712efc45ef87674fb5ac26c37c912Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]

Te6edf3BUFFER_TEST_TARGET Tff7b72= T79c0ff32000
Te6edf3LINK_UP_WAIT Tff7b72= T79c0ff0.050

Tff7b72def Td2a8fftargets_jobTb4b4b4(Te6edf3callerTb4b4b4)Tb4b4b4:
Te6edf3cmd Tff7b72= Ta5d6ff"Ta5d6ffpython -c Tffea00\"Ta5d6fffrom tests.link import targets; targets()Tffea00\"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffOpening subprocess for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3cmdTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3ppath Tff7b72= Te6edf3osTff7b72.Td2a8ffgetcwdTb4b4b4(Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3callerTff7b72.Td2a8ffprocess Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(Te6edf3shlexTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3cmdTb4b4b4)Tb4b4b4, Te6edf3cwdTff7b72=Te6edf3ppathTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Te6edf3e
Te6edf3callerTff7b72.Td2a8ffpipe_is_open Tff7b72= Tff7b72False

Te6edf3c_rns Tff7b72= Tff7b72None
Tff7b72def Td2a8ffinit_rnsTb4b4b4(Te6edf3callerTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3c_rns
Tff7b72if Te6edf3c_rns Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3caller Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3targets_jobTb4b4b4(Te6edf3callerTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff2Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffStarting local RNS instance...Ta5d6ff"Tb4b4b4)
Te6edf3c_rns Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Ta5d6ff"Ta5d6ff./tests/rnsconfigTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3caller Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3c_rnsTff7b72.Td2a8ffm_proc Tff7b72= Te6edf3callerTff7b72.Td2a8ffprocess

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDone starting local RNS instance...Ta5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffclose_rnsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3c_rns
Tff7b72if Te6edf3c_rns Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3c_rnsTff7b72.Td2a8ffm_procTff7b72.Td2a8ffkillTb4b4b4(Tb4b4b4)

Tff7b72class T56d364TestLinkTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass

Tf0883e@classmethod
Tff7b72def Td2a8fftearDownClassTb4b4b4(Tff7b72clsTb4b4b4)Tb4b4b4:
Te6edf3close_rnsTb4b4b4(Tb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_00_valid_announceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting valid announce...Ta5d6ff"Tb4b4b4)
Te6edf3fid Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3dst Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3fidTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Te6edf3ap Tff7b72= Te6edf3dstTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3sendTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3apTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffvalidate_announceTb4b4b4(Te6edf3apTb4b4b4)Tb4b4b4, Tff7b72TrueTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_01_invalid_announceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting invalid announce...Ta5d6ff"Tb4b4b4)
Te6edf3fid Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3dst Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3fidTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Te6edf3ap Tff7b72= Te6edf3dstTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3sendTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3fake_dst Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ff1333b911fa8ebb16726996adbe3c6262Ta5d6ff"Tb4b4b4)
Te6edf3pre_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3apTff7b72.Td2a8ffdataTb4b4b4)
Te6edf3apTff7b72.Td2a8ffdata Tff7b72= Te6edf3fake_dstTff7b72+Te6edf3apTff7b72.Td2a8ffdataTb4b4b4[T79c0ff16Tb4b4b4:Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3pre_lenTb4b4b4, Tffa657lenTb4b4b4(Te6edf3apTff7b72.Td2a8ffdataTb4b4b4)Tb4b4b4)
Te6edf3apTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3apTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffvalidate_announceTb4b4b4(Te6edf3apTb4b4b4)Tb4b4b4, Tff7b72FalseTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_02_establishTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting default mode link establishment...Ta5d6ff"Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)
Te6edf3exc_triggered Tff7b72= Tff7b72False
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting AES_128_CBC mode link establishment...Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3l2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4, Te6edf3modeTff7b72=Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMODE_AES128_CBCTb4b4b4)
Tff7b72except Tf85149TypeError Tff7b72as Te6edf3eTb4b4b4: Te6edf3exc_triggered Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3exc_triggeredTb4b4b4, Tff7b72TrueTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting AES_256_CBC mode link establishment...Ta5d6ff"Tb4b4b4)
Te6edf3l3 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4, Te6edf3modeTff7b72=Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMODE_AES256_CBCTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l3Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l3Tff7b72.Td2a8ffmodeTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMODE_AES256_CBCTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3l3Tff7b72.Td2a8ffderived_keyTb4b4b4)Tb4b4b4, T79c0ff64Tb4b4b4)

Te6edf3l3Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l3Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_03a_packetsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting default mode link packets...Ta5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3b Tff7b72= T79c0ff0
Te6edf3pr_t Tff7b72= T79c0ff0
Te6edf3receipts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff" Tff7b72or Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU Tff7b72> T79c0ff500Tb4b4b4:
Te6edf3num_packets Tff7b72= T79c0ff50
Tff7b72elseTb4b4b4:
Te6edf3num_packets Tff7b72= T79c0ff500

Te6edf3packet_size Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDU
Te6edf3pstart Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3num_packetsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff link packets of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3packet_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes...Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3num_packetsTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.003Tb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3packet_size
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3packet_sizeTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3p Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3l1Tb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3receiptsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3pr_t Tff7b72+Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSent Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3pr_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffChecking receipts...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3all_ok Tff7b72= Tff7b72False
Te6edf3receipt_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff35
Tff7b72while Tff7b72not Te6edf3all_ok Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3receipt_timeoutTb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Te6edf3receiptsTb4b4b4:
Te6edf3all_ok Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3rTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3all_ok Tff7b72= Tff7b72False
Tff7b72break
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3pduration Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3pstart

Te6edf3n_failed Tff7b72= T79c0ff0
Tff7b72for Te6edf3r Tff7b72in Te6edf3receiptsTb4b4b4:
Tff7b72if Tff7b72not Te6edf3rTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3n_failed Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3n_failed Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ns Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff" Tff7b72if Te6edf3n_failed Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFailed to receive proof for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3n_failedTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff packetTa5d6ff"Tff7b72+Te6edf3nsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3all_okTb4b4b4, Tff7b72TrueTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffOK!Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSingle packet and proof round-trip throughput is Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3pdurationTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_03b_packetsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting AES_256_CBC mode link packets...Ta5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4, Te6edf3modeTff7b72=Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMODE_AES256_CBCTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3b Tff7b72= T79c0ff0
Te6edf3pr_t Tff7b72= T79c0ff0
Te6edf3receipts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff" Tff7b72or Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU Tff7b72> T79c0ff500Tb4b4b4:
Te6edf3num_packets Tff7b72= T79c0ff50
Tff7b72elseTb4b4b4:
Te6edf3num_packets Tff7b72= T79c0ff500

Te6edf3packet_size Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDU
Te6edf3pstart Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3num_packetsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff link packets of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3packet_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes...Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3num_packetsTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.003Tb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3packet_size
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3packet_sizeTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3p Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3l1Tb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3receiptsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3pr_t Tff7b72+Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSent Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3pr_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffChecking receipts...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3all_ok Tff7b72= Tff7b72False
Te6edf3receipt_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff35
Tff7b72while Tff7b72not Te6edf3all_ok Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3receipt_timeoutTb4b4b4:
Tff7b72for Te6edf3r Tff7b72in Te6edf3receiptsTb4b4b4:
Te6edf3all_ok Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3rTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3all_ok Tff7b72= Tff7b72False
Tff7b72break
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3pduration Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3pstart

Te6edf3n_failed Tff7b72= T79c0ff0
Tff7b72for Te6edf3r Tff7b72in Te6edf3receiptsTb4b4b4:
Tff7b72if Tff7b72not Te6edf3rTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3n_failed Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3n_failed Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ns Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff" Tff7b72if Te6edf3n_failed Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFailed to receive proof for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3n_failedTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff packetTa5d6ff"Tff7b72+Te6edf3nsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3all_okTb4b4b4, Tff7b72TrueTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffOK!Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSingle packet and proof round-trip throughput is Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3pdurationTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_04_micro_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffMicro resource testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff128
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSome textTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumbersTa5d6ff"Tb4b4b4: Tb4b4b4[T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff4Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with metadata...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with invalid size metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Te6edf3metadata Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffMETADATA_MAX_SIZETff7b72+T79c0ff1Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with invalid size metadata...Ta5d6ff"Tb4b4b4)
Te6edf3exception_raised Tff7b72= Tff7b72False
Tff7b72tryTb4b4b4: Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Tff7b72except Tf85149SystemErrorTb4b4b4: Te6edf3exception_raised Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3exception_raisedTb4b4b4, Tff7b72TrueTb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_05_mini_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffMini resource testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff256Tff7b72*T79c0ff1000

T8b949e# Test sending resource without metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSome textTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumbersTa5d6ff"Tb4b4b4: Tb4b4b4[T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff4Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8192Tb4b4b4)Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with metadata...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_06_small_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSmall resource testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSome textTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumbersTa5d6ff"Tb4b4b4: Tb4b4b4[T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff4Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8192Tb4b4b4)Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with metadata...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3metadataTff7b72=Te6edf3metadataTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# This is a hack, don't do it. Use the callbacks instead.
Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)


Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_07_medium_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSkipping medium resource test...Ta5d6ff"Tb4b4b4)
Tff7b72return
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffMedium resource testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff5Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4, Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8fflr_callbackTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstatus
Tff7b72while Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with metadata
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSome textTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumbersTa5d6ff"Tb4b4b4: Tb4b4b4[T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff4Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8192Tb4b4b4)Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with metadata...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4, Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8fflr_callbackTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstatus
Tff7b72while Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Te6edf3large_resource_status Tff7b72= Tff7b72None
Tff7b72def Td2a8fflr_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstatus

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_09_large_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSkipping large resource test...Ta5d6ff"Tb4b4b4)
Tff7b72return

Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLarge resource testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff50Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4, Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8fflr_callbackTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstatus
Tff7b72while Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_statusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

T8b949e# Test sending resource with metadata
Te6edf3metadata Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSome textTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumbersTa5d6ff"Tb4b4b4: Tb4b4b4[T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff4Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff8192Tb4b4b4)Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource with metadata...Ta5d6ff"Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4, Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8fflr_callbackTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstatus
Tff7b72while Te6edf3TestLinkTff7b72.Td2a8fflarge_resource_status Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource with metadata completed at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ffps (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tffd700}Ta5d6ff, Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3tTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_10_channel_round_tripTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3c_rns
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffChannel round trip testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3received Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffhandle_messageTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3MessageBaseTb4b4b4)Tb4b4b4:
Te6edf3receivedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3messageTb4b4b4)

Te6edf3test_message Tff7b72= Te6edf3MessageTestTb4b4b4(Tb4b4b4)
Te6edf3test_messageTff7b72.Td2a8ffdata Tff7b72= Ta5d6ff"Ta5d6ffHelloTa5d6ff"

Te6edf3channel Tff7b72= Te6edf3l1Tff7b72.Td2a8ffget_channelTb4b4b4(Tb4b4b4)
Te6edf3channelTff7b72.Td2a8ffregister_message_typeTb4b4b4(Te6edf3MessageTestTb4b4b4)
Te6edf3channelTff7b72.Td2a8ffadd_message_handlerTb4b4b4(Te6edf3handle_messageTb4b4b4)
Te6edf3channelTff7b72.Td2a8ffsendTb4b4b4(Te6edf3test_messageTb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(T79c0ff1Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3receivedTb4b4b4)Tb4b4b4)

Te6edf3rx_message Tff7b72= Te6edf3receivedTb4b4b4[T79c0ff0Tb4b4b4]

Tff7b72selfTff7b72.Td2a8ffassertIsInstanceTb4b4b4(Te6edf3rx_messageTb4b4b4, Te6edf3MessageTestTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Ta5d6ff"Ta5d6ffHello backTa5d6ff"Tb4b4b4, Te6edf3rx_messageTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3test_messageTff7b72.Td2a8ffidTb4b4b4, Te6edf3rx_messageTff7b72.Td2a8ffidTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertNotEqualTb4b4b4(Te6edf3test_messageTff7b72.Td2a8ffnot_serializedTb4b4b4, Te6edf3rx_messageTff7b72.Td2a8ffnot_serializedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3l1Tff7b72.Td2a8ff_channelTff7b72.Td2a8ff_rx_ringTb4b4b4)Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3l1Tff7b72.Td2a8ff_channelTff7b72.Td2a8ff_rx_ringTb4b4b4)Tb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_11_buffer_round_tripTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3c_rns
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffBuffer round trip testTa5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)
Te6edf3buffer Tff7b72= Tff7b72None

Te6edf3received Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffhandle_dataTb4b4b4(Te6edf3ready_bytesTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3bufferTff7b72.Td2a8ffreadTb4b4b4(Te6edf3ready_bytesTb4b4b4)
Te6edf3receivedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dataTb4b4b4)

Te6edf3channel Tff7b72= Te6edf3l1Tff7b72.Td2a8ffget_channelTb4b4b4(Tb4b4b4)
Te6edf3buffer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffBufferTff7b72.Td2a8ffcreate_bidirectional_bufferTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3channelTb4b4b4, Te6edf3handle_dataTb4b4b4)

Te6edf3bufferTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffHi thereTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3bufferTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(T79c0ff1 Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3receivedTb4b4b4)Tb4b4b4)

Te6edf3rx_message Tff7b72= Te6edf3receivedTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Ta5d6ff"Ta5d6ffHi there back at youTa5d6ff"Tb4b4b4, Te6edf3rx_messageTb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)

Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffSKIP_NORMAL_TESTSTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72None Tff7b72and Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffRUN_SLOW_TESTSTa5d6ff'Tb4b4b4) Tff7b72== Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffSkippingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_12_buffer_round_trip_bigTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3local_bitrate Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3c_rnsTb4b4b4, Te6edf3buffer_read_target
Te6edf3init_rnsTb4b4b4(Tff7b72selfTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffBuffer round trip testTa5d6ff"Tb4b4b4)

Te6edf3local_interface Tff7b72= Tffa657nextTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3ifaceTb4b4b4: Tffa657isinstanceTb4b4b4(Te6edf3ifaceTb4b4b4, Te6edf3LocalClientInterfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertIsNotNoneTb4b4b4(Te6edf3local_interfaceTb4b4b4)
Te6edf3original_bitrate Tff7b72= Te6edf3local_interfaceTff7b72.Td2a8ffbitrate

Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3local_bitrate Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3local_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3local_bitrate
Te6edf3local_interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72True
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffForcing local bitrate of Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Te6edf3local_bitrateTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff bps (Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3local_bitrateTff7b72/T79c0ff8Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff B/s)Ta5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3destTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6fffb48da0e82e6e01ba0c014513f74540dTa5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
T8b949e# delay a reasonable time for link to come up at current bitrate
Te6edf3link_sleep Tff7b72= Tffa657maxTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDU Tff7b72* T79c0ff3 Tff7b72/ Te6edf3local_interfaceTff7b72.Td2a8ffbitrate Tff7b72* T79c0ff8Tb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3timeout_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3link_sleep
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffWaiting Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3link_sleepTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff sec for link to come upTa5d6ff"Tb4b4b4)
Tff7b72while Te6edf3l1Tff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeout_atTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4)

Te6edf3buffer Tff7b72= Tff7b72None
Te6edf3received Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffhandle_dataTb4b4b4(Te6edf3ready_bytesTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3received_bytes
Te6edf3data Tff7b72= Te6edf3bufferTff7b72.Td2a8ffreadTb4b4b4(Te6edf3ready_bytesTb4b4b4)
Te6edf3receivedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dataTb4b4b4)

Te6edf3channel Tff7b72= Te6edf3l1Tff7b72.Td2a8ffget_channelTb4b4b4(Tb4b4b4)
Te6edf3buffer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffBufferTff7b72.Td2a8ffcreate_bidirectional_bufferTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3channelTb4b4b4, Te6edf3handle_dataTb4b4b4)

T8b949e# try to make the message big enough to split across packets, but
T8b949e# small enough to make the test complete in a reasonable amount of time
T8b949e# seed_text = "0123456789"
T8b949e# message = seed_text*ceil(min(max(local_interface.bitrate / 8,
T8b949e# StreamDataMessage.MAX_DATA_LEN * 2 / len(seed_text)),
T8b949e# 1000))

Tff7b72if Te6edf3local_interfaceTff7b72.Td2a8ffbitrate Tff7b72< T79c0ff1000Tb4b4b4:
Te6edf3target_bytes Tff7b72= T79c0ff3000
Tff7b72elseTb4b4b4:
Te6edf3target_bytes Tff7b72= Te6edf3BUFFER_TEST_TARGET
Te6edf3randomTff7b72.Td2a8ffseedTb4b4b4(T79c0ff154889Tb4b4b4)
Te6edf3message Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandbytesTb4b4b4(Te6edf3target_bytesTb4b4b4)
Te6edf3buffer_read_target Tff7b72= Tffa657lenTb4b4b4(Te6edf3messageTb4b4b4)
T8b949e# the return message will have an appendage string " back at you"
T8b949e# for every StreamDataMessage that arrives. To verify, we need
T8b949e# to insert that string every MAX_DATA_LEN and also at the end.
Te6edf3expected_rx_message Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Te6edf3i Tff7b72% Te6edf3StreamDataMessageTff7b72.Td2a8ffMAX_DATA_LENTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3expected_rx_message Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff back at youTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3expected_rx_message Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3messageTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4]Tb4b4b4)
Te6edf3expected_rx_message Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff back at youTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

T8b949e# since the segments will be received at max length for a
T8b949e# StreamDataMessage, the appended text will end up in a
T8b949e# separate packet.
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff bytes, receiving Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3expected_rx_messageTb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff bytes, Ta5d6ff"Tb4b4b4)
Te6edf3bufferTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3messageTb4b4b4)
Te6edf3bufferTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff4
Tff7b72while Tff7b72not Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3receivedTb4b4b4)Tffd700}Ta5d6ff chunks so farTa5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)

Te6edf3data Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3rx Tff7b72in Te6edf3receivedTb4b4b4:
Tff7b72if Te6edf3rxTb4b4b4: Te6edf3dataTff7b72.Td2a8ffextendTb4b4b4(Te6edf3rxTb4b4b4)
Te6edf3rx_message Tff7b72= Te6edf3data

Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3receivedTb4b4b4)Tffd700}Ta5d6ff chunks, totalling Tffd700{Tffa657lenTb4b4b4(Te6edf3rx_messageTb4b4b4)Tffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3expected_rx_messageTb4b4b4)Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3rx_messageTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3expected_rx_messageTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3expected_rx_messageTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3rx_messageTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3expected_rx_messageTb4b4b4, Te6edf3rx_messageTb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LINK_UP_WAITTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3l1Tff7b72.Td2a8ffstatusTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3local_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3original_bitrate
Te6edf3local_interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72False

T8b949e# Run with
T8b949e# RUN_SLOW_TESTS=1 python tests/link.py TestLink.test_13_buffer_round_trip_big_slow
T8b949e# Or
T8b949e# make RUN_SLOW_TESTS=1 test
Tf0883e@skipIfTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff'Ta5d6ffRUN_SLOW_TESTSTa5d6ff'Tb4b4b4) Tff7b72== Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffNot running slow testsTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_13_buffer_round_trip_big_slowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftest_12_buffer_round_trip_bigTb4b4b4(Te6edf3local_bitrateTff7b72=T79c0ff410Tb4b4b4)

Tff7b72def Td2a8ffsize_strTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)

Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Te6edf3verbosityTff7b72=T79c0ff1Tb4b4b4)

Te6edf3buffer_read_len Tff7b72= T79c0ff0
Tff7b72def Td2a8fftargetsTb4b4b4(Te6edf3ypTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3ypTb4b4b4:
Tff7b72import T7ee787yappi

Tff7b72def Td2a8ffresource_startedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource startedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ypTb4b4b4:
Te6edf3yappiTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffresource_concludedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource concludedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ypTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3yappiTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Te6edf3yappiTff7b72.Td2a8ffget_func_statsTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsaveTb4b4b4(Ta5d6ff"Ta5d6ffreceiver_main_calls.dataTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffpstatTa5d6ff"Tb4b4b4)
Te6edf3threads Tff7b72= Te6edf3yappiTff7b72.Td2a8ffget_thread_statsTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3thread Tff7b72in Te6edf3threadsTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6ff"Ta5d6ffFunction stats for (Tffd700%sTa5d6ff) (Tffd700%dTa5d6ff)Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3threadTff7b72.Td2a8ffnameTb4b4b4, Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)
Tb4b4b4) T8b949e# it is the Thread.__class__.__name__
Te6edf3yappiTff7b72.Td2a8ffget_func_statsTb4b4b4(Te6edf3ctx_idTff7b72=Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)Tff7b72.Td2a8ffsaveTb4b4b4(Ta5d6ff"Ta5d6ffreceiver_thread_Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.dataTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffpstatTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)


Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffrxptimeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3rx_pr Tff7b72= Tb4b4b4(Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTff7b72.Td2a8ffrxbTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTff7b72.Td2a8ffrxptime
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAverage RX proccessing rate: Ta5d6ff"Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3rx_prTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8fflink_establishedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink establishedTa5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_ALLTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Te6edf3resource_startedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Te6edf3resource_concludedTb4b4b4)
Te6edf3channel Tff7b72= Te6edf3linkTff7b72.Td2a8ffget_channelTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffhandle_messageTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3messageTb4b4b4, Te6edf3MessageTestTb4b4b4)Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffdata Tff7b72= Te6edf3messageTff7b72.Td2a8ffdata Tff7b72+ Ta5d6ff"Ta5d6ff backTa5d6ff"
Te6edf3channelTff7b72.Td2a8ffsendTb4b4b4(Te6edf3messageTb4b4b4)

Te6edf3channelTff7b72.Td2a8ffregister_message_typeTb4b4b4(Te6edf3MessageTestTb4b4b4)
Te6edf3channelTff7b72.Td2a8ffadd_message_handlerTb4b4b4(Te6edf3handle_messageTb4b4b4)

Te6edf3buffer Tff7b72= Tff7b72None

Te6edf3response_data Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffhandle_bufferTb4b4b4(Te6edf3ready_bytesTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3buffer_read_lenTb4b4b4, Te6edf3BUFFER_TEST_TARGET
Te6edf3data Tff7b72= Te6edf3bufferTff7b72.Td2a8ffreadTb4b4b4(Te6edf3ready_bytesTb4b4b4)
Te6edf3buffer_read_len Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3response_dataTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72if Te6edf3data Tff7b72== Ta5d6ff"Ta5d6ffHi thereTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending responseTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3data Tff7b72in Te6edf3response_dataTb4b4b4:
Te6edf3bufferTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3data Tff7b72+ Ta5d6ff"Ta5d6ff back at youTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3bufferTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3buffer_read_len Tff7b72= T79c0ff0

Tff7b72if Te6edf3buffer_read_len Tff7b72== Te6edf3BUFFER_TEST_TARGETTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending responseTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3data Tff7b72in Te6edf3response_dataTb4b4b4:
Te6edf3bufferTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3data Tff7b72+ Ta5d6ff"Ta5d6ff back at youTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3bufferTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3buffer_read_len Tff7b72= T79c0ff0

Te6edf3buffer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffBufferTff7b72.Td2a8ffcreate_bidirectional_bufferTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3channelTb4b4b4, Te6edf3handle_bufferTb4b4b4)

Te6edf3m_rns Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Ta5d6ff"Ta5d6ff./tests/rnsconfigTa5d6ff"Tb4b4b4, Te6edf3logdestTff7b72=Te6edf3RNSTff7b72.Td2a8ffLOG_FILETb4b4b4, Te6edf3loglevelTff7b72=Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3d1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)
Te6edf3d1Tff7b72.Td2a8ffset_proof_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPROVE_ALLTb4b4b4)
Te6edf3d1Tff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Te6edf3link_establishedTb4b4b4)

Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)

Tff7b72def Td2a8fftargets_profilingTb4b4b4(Te6edf3ypTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3targetsTb4b4b4(Te6edf3ypTb4b4b4)

Tff7b72def Td2a8ffprofile_resourceTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# import cProfile
T8b949e# import pstats
T8b949e# from pstats import SortKey
T8b949e# cProfile.runctx("entry()", {"entry": resource_profiling, "size_str": size_str}, {}, "profile-resource.data")
T8b949e# p = pstats.Stats("profile-resource.data")

Te6edf3resource_profilingTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffprofile_targetsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3targets_profilingTb4b4b4(Te6edf3ypTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# cProfile.runctx("entry()", {"entry": targets_profiling, "size_str": size_str}, {}, "profile-targets.data")
T8b949e# p = pstats.Stats("profile-targets.data")
T8b949e# p.strip_dirs().sort_stats(SortKey.TIME, SortKey.CUMULATIVE).print_stats()


Tff7b72def Td2a8ffresource_profilingTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3init_rnsTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# TODO: Load this from public bytes only
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3id1Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffestablishTa5d6ff"Tb4b4b4)

Te6edf3l1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)

Te6edf3resource_timeout Tff7b72= T79c0ff120
Te6edf3resource_size Tff7b72= T79c0ff5Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3data Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3resource_sizeTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending Ta5d6ff"Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3resource_sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff resource...Ta5d6ff"Tb4b4b4)

Tff7b72import T7ee787yappi
Te6edf3yappiTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3l1Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3resource_timeoutTb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)

Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)

Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource completed at Ta5d6ff"Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3resource_sizeTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Te6edf3yappiTff7b72.Td2a8ffget_func_statsTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsaveTb4b4b4(Ta5d6ff"Ta5d6ffsender_main_calls.dataTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffpstatTa5d6ff"Tb4b4b4)
Te6edf3threads Tff7b72= Te6edf3yappiTff7b72.Td2a8ffget_thread_statsTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3thread Tff7b72in Te6edf3threadsTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6ff"Ta5d6ffFunction stats for (Tffd700%sTa5d6ff) (Tffd700%dTa5d6ff)Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3threadTff7b72.Td2a8ffnameTb4b4b4, Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)
Tb4b4b4) T8b949e# it is the Thread.__class__.__name__
Te6edf3yappiTff7b72.Td2a8ffget_func_statsTb4b4b4(Te6edf3ctx_idTff7b72=Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)Tff7b72.Td2a8ffsaveTb4b4b4(Ta5d6ff"Ta5d6ffsender_thread_Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3threadTff7b72.Td2a8ffidTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.dataTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffpstatTa5d6ff"Tb4b4b4)

T8b949e# t_pstats = yappi.convert2pstats(tstats)
T8b949e# t_pstats.save("resource_tstat.data", type="pstat")

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffrxptimeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3rx_pr Tff7b72= Tb4b4b4(Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTff7b72.Td2a8ffrxbTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffattached_interfaceTff7b72.Td2a8ffrxptime
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAverage RX proccessing rate: Ta5d6ff"Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3rx_prTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Te6edf3l1Tff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)

Tff7b72def Td2a8ffsize_strTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────